package com.ddyx.util;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;

import org.apache.commons.httpclient.Header;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.FileEntity;
import org.apache.http.entity.InputStreamEntity;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * @ClassName: WxCommonUtil.java
 * @Description:
 * @author:
 * @date: 2018年3月12日
 */
/**
 * @ClassName: WxCommonUtil.java
 * @Description: 微信小程序相关的公共方法
 * @author: liuhoujie
 * @date: 2018年3月15日
 */
public class WxCommonUtil {
	// private static CloseableHttpClient httpClient = HttpClients.createDefault();
	private static final String appId = PropertiesUtil.getProperty("sys.appid");
	private static final String appSecret = PropertiesUtil.getProperty("sys.appSecret");
	private static ObjectMapper jsonMapper = new ObjectMapper();
	/**
	 * @description 获取微信access_token
	 * @author liuhoujie
	 * @return token
	 * @throws Exception
	 */
	public static String getToken() {
		String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret="
				+ appSecret + "";
		HttpGet httpGet = new HttpGet(url);
		CloseableHttpResponse response = null;
		HttpEntity entity = null;
		String token = null;
		try {
			response = HttpClients.createDefault().execute(httpGet);
			entity = response.getEntity();
			String json = EntityUtils.toString(entity, "utf-8");
			// System.out.println(json);
			Map map = jsonMapper.readValue(json, Map.class);
			token = (String) map.get("access_token");
			response.close();
		} catch (Exception e) {
			System.out.println("参数错误");
			e.printStackTrace();
		}
		return token;
	}
	
	
	/**
	 * @description 微信新增素材接口上传图片
	 * @author liuhoujie
	 * @return token
	 * @throws Exception
	 */
	public static String wxPicUpload(String picUrl) {
		String wxPicUploadUrl = PropertiesUtil.getProperty("wxPicUploadUrl");
		wxPicUploadUrl=wxPicUploadUrl.replace("ACCESS_TOKEN", getToken());
		wxPicUploadUrl=wxPicUploadUrl.replace("TYPE", "image");
		System.out.println(wxPicUploadUrl);
		
		HttpGet get = new HttpGet(picUrl);
		CloseableHttpResponse response = null;
		String lastStr = picUrl.substring(picUrl.lastIndexOf("/")+1);
		
		String result = null;
		try {
			/*图片落地*/
			response = HttpClients.createDefault().execute(get);
			InputStream ins = response.getEntity().getContent();
			
			/**
			 * 第一部分
			 */
			URL urlObj = new URL(wxPicUploadUrl);
			HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();
			con.setRequestMethod("POST"); // 以Post方式提交表单，默认get方式
			con.setDoInput(true);
			con.setDoOutput(true);
			con.setUseCaches(false); // post方式不能使用缓存
			// 设置请求头信息
			con.setRequestProperty("Connection", "Keep-Alive");
			con.setRequestProperty("Charset", "UTF-8");
			// 设置边界
			String BOUNDARY = "----------" + System.currentTimeMillis();
			con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
			// 请求正文信息
			// 第一部分：
			StringBuilder sb = new StringBuilder();
			sb.append("--"); // 必须多两道线
			sb.append(BOUNDARY);
			sb.append("\r\n");
			sb.append("Content-Disposition: form-data;name=\"file\";filename=\"" + System.currentTimeMillis()+".jpg" + "\"\r\n");
			sb.append("Content-Type:application/octet-stream\r\n\r\n");
			byte[] head = sb.toString().getBytes("utf-8");
			// 获得输出流
			OutputStream out = new DataOutputStream(con.getOutputStream());
			// 输出表头
			out.write(head);
			// 文件正文部分
			// 把文件已流文件的方式 推入到url中
			DataInputStream in = new DataInputStream(ins);
			int bytes = 0;
			byte[] bufferOut = new byte[1024];
			while ((bytes = in.read(bufferOut)) != -1) {
				out.write(bufferOut, 0, bytes);
			}
			in.close();
			// 结尾部分
			byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线
			out.write(foot);
			out.flush();
			out.close();
			ins.close();
			StringBuffer buffer = new StringBuffer();
			BufferedReader reader = null;
			try {
				// 定义BufferedReader输入流来读取URL的响应
				reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
				String line = null;
				while ((line = reader.readLine()) != null) {
					// System.out.println(line);
					buffer.append(line);
				}
				if (result == null) {
					result = buffer.toString();
				}
			} catch (IOException e) {
				System.out.println("发送POST请求出现异常！" + e);
				e.printStackTrace();
				throw new IOException("数据读取异常");
			} finally {
				if (reader != null) {
					reader.close();
				}
			}
			System.out.println("=====>>>" + result);
			
		} catch (Exception e) {
			System.out.println("参数错误");
			e.printStackTrace();
		}
		
		return result;
	}
	
	public static void main(String[] args) {
		String wxPicUpload = wxPicUpload("http://p1az9gcpw.bkt.clouddn.com/FrhhYg9LtKPUUZycupfHdjDsAITx");
		try {
			String writeValueAsString = jsonMapper.writeValueAsString(wxPicUpload);
			System.out.println(writeValueAsString);
		} catch (JsonProcessingException e) {
			e.printStackTrace();
		}
	}
}
